/*
	Ajax(options)
		options:参数对象
			@type:请求类型
			@datatype:数据类型
			@url:请求路径
			@data:要发送的请求数据
			@timeout:请求超时
			@success:请求成功的回调函数
			@error:请求失败的回调函数
*/
function Ajax(options) {
  //1、如果options没有指定的options对象，那么我们就给它赋值一个空对象{}
  options = options || {};
  //2、如果没有指定请求方式，那么我们就赋值指定方式,反之默认为GET,并转成大写|小写
  options.type = (options.type || "GET").toUpperCase();
  //3、如果有指定响应数据类型，那么就赋值指定值，反之默认为json格式的数据
  options.datatype = options.datatype || "json";

  //4、写ajax的过程
  if (window.XMLHttpRequest) {
    var xhr = new XMLHttpRequest();
  } else {
    var xhr = new ActiveXObject("Microsofr.XMLHTTP");
  }
  //4-1、建立链接并发送请求
  /*
	 考虑两种请求方式
		get:options.url + '?' + params
			@params:要发送给服务器的请求数据
		post:options.url
	 */
  if (options.type == "GET") {
    //GET请求
    //4-2、设置options.data
    var params = fromParams(options.data);
    xhr.open("GET", options.url + "?" + params, true);
    xhr.send(null);
  } else if (options.type == "POST") {
    xhr.open("POST", options.url, true);
    //4-3、给post请求添加请求头
    xhr.setRequestHeader("Content-type", "application/json");
    xhr.send(JSON.stringify(options.data));
  }
  //4-2-1、格式化请求参数(针对post)
  function fromParams(data) {
    var arr = []; //用来存放处理后的参数 [name = aa ,age = 18....]
    //4-2-2、将data转码后插入到数组中
    for (var item in data) {
      arr.push(encodeURIComponent(item) + "=" + encodeURIComponent(data[item]));
    }
    //4-2-3、将发送的数据加点难度(提高安全性【没什么用】)
    arr.push(("v=" + Math.random()).replace(".", ""));
    return arr.join("&"); //xxx.html?xx=xx&xxx=xxx....
  }
  //5、设置请求超时时(时间戳)
  options.timeout = options.timeout || 5000;
  setTimeout(function () {
    if (xhr.readyState != 4) {
      xhr.abort(); //关闭请求
    }
  }, options.timeout);
  //6、请求响应事件
  xhr.onreadystatechange = function () {
    if (xhr.readyState == 4) {
      if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
        options.success && options.success(xhr.responseText, xhr.responseXML);
      } else {
        options.error && options.error(xhr.status);
      }
    }
  };
}
